﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MedicalAssistant.core;
using MedicalAssistant.core.dao;
using MedicalAssistant.core.dao.xml;

namespace MedicalAssistant
{
    public partial class Pacientes : Form
    {
        public enum Modo
        {
            EDITANDO,
            VIZUALIZANDO,
            NOVO
        } ;

        private Facade facade;
        private List<string> sexoOpcoes;
        private Modo modo;

        public Pacientes()
        {
            InitializeComponent();
            facade = new Facade();

            sexoOpcoes = new List<string>();
            sexoOpcoes.Add("Masculino");
            sexoOpcoes.Add("Feminino");
            comboBoxSexo.DataSource = sexoOpcoes;

         
            if (facade.GetAllPacientes().Count == 0)
            {
                ModoNovoPaciente();
                return;
            }
            Paciente p = facade.GetAllPacientes()[0];
            ModoVizualizarPaciente();
            SetForm(p);
        }

        private void ModoVizualizarPaciente()
        {
            modo = Modo.VIZUALIZANDO;

            uint no = (uint)numericUpDownProntuario.Value;
            Paciente paciente = facade.FindByIdPacientes(no);
            if (paciente != null)
            {
                SetForm(paciente);
            }
            else
            {
                LimpaTela();
            }


            textBoxNome.Enabled = false;
            numericUpDownProntuario.Enabled = true;
            textBoxTelefone.Enabled = false;
            dateTimePickerNascimento.Enabled = false;
            textBoxResponsavel.Enabled = false;
            comboBoxSexo.Enabled = false;

            textBoxRua.Enabled = false;
            textBoxNo.Enabled = false;
            textBoxBairro.Enabled = false;
            textBoxCidade.Enabled = false;
            textBoxEstado.Enabled = false;
            textBoxApart.Enabled = false;
            textBoxBloco.Enabled = false;
            textBoxDistrito.Enabled = false;
            textBoxCEP.Enabled = false;
        }

        private void ModoNovoPaciente()
        {
            modo = Modo.NOVO;

            LimpaTela();
            HabilitarCampos();
        }

        private void HabilitarCampos()
        {
            textBoxNome.Enabled = true;
            numericUpDownProntuario.Enabled = true;
            textBoxTelefone.Enabled = true;
            dateTimePickerNascimento.Enabled = true;
            textBoxResponsavel.Enabled = true;
            comboBoxSexo.Enabled = true;

            textBoxRua.Enabled = true;
            textBoxNo.Enabled = true;
            textBoxBairro.Enabled = true;
            textBoxCidade.Enabled = true;
            textBoxEstado.Enabled = true;
            textBoxApart.Enabled = true;
            textBoxBloco.Enabled = true;
            textBoxDistrito.Enabled = true;
            textBoxCEP.Enabled = true;
        }

        private void LimpaTela()
        {
            textBoxNome.Clear();
            textBoxTelefone.Clear();
            dateTimePickerNascimento.Value = DateTime.Today;
            textBoxResponsavel.Clear();
            comboBoxSexo.SelectedIndex = 0;

            textBoxRua.Clear();
            textBoxNo.Clear();
            textBoxBairro.Clear();
            textBoxCidade.Clear();
            textBoxEstado.Clear();
            textBoxApart.Clear();
            textBoxBloco.Clear();
            textBoxDistrito.Clear();
            textBoxCEP.Clear();
        }

        private void SetForm(Paciente p)
        {
            textBoxNome.Text = p.Nome;
            numericUpDownProntuario.Value = p.Prontuario;
            textBoxTelefone.Text = p.Telefone;
            dateTimePickerNascimento.Value = p.DataDeNascimento;
            textBoxResponsavel.Text = p.Responsavel;

            if (p.Sexo == Paciente.Sexualidade.M)
            {
                comboBoxSexo.SelectedIndex = 0;
            }
            else
            {
                comboBoxSexo.SelectedIndex = 1;
            }

            textBoxRua.Text = p.Endereco.Rua;
            textBoxNo.Text = p.Endereco.Numero;
            textBoxBairro.Text = p.Endereco.Bairro;
            textBoxCidade.Text = p.Endereco.Cidade;
            textBoxEstado.Text = p.Endereco.Estado;
            textBoxApart.Text = p.Endereco.Apartamento;
            textBoxBloco.Text = p.Endereco.Bloco;
            textBoxDistrito.Text = p.Endereco.Distrito;
            textBoxCEP.Text = p.Endereco.Cep;
        }

        private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
        {

        }

        private void saveToolStripButton_Click(object sender, EventArgs e)
        {
            if (modo == Modo.VIZUALIZANDO)
            {
                return;
            }

            Paciente.Sexualidade sexo = Paciente.Sexualidade.M;
            if (comboBoxSexo.Text == sexoOpcoes.Last())
            {
                sexo = Paciente.Sexualidade.F;
            }

            try
            {
                Endereco endereco = new Endereco(textBoxRua.Text,textBoxNo.Text,
                textBoxBairro.Text,textBoxCidade.Text,textBoxEstado.Text,
                textBoxApart.Text,textBoxBloco.Text,textBoxDistrito.Text, textBoxCEP.Text);

                Paciente paciente = new Paciente(textBoxNome.Text,(uint) numericUpDownProntuario.Value,textBoxTelefone.Text,dateTimePickerNascimento.Value,textBoxResponsavel.Text,sexo,endereco);

                if (modo == Modo.NOVO)
                {
                    facade.SavePaciente(paciente);
                    MessageBox.Show(textBoxNome.Text + " salvo!", "Salvar", MessageBoxButtons.OK, MessageBoxIcon.Information);                    
                }
                else
                {
                    facade.EditarPaciente(paciente);
                    MessageBox.Show(textBoxNome.Text + " editado!", "Editar", MessageBoxButtons.OK, MessageBoxIcon.Information);                                        
                }
                ModoVizualizarPaciente();
            }
            catch (ExcecaoDoSistema ex)
            {
                MessageBox.Show(ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }


        }

        private void Pacientes_Load(object sender, EventArgs e)
        {

        }

        private void newToolStripButton_Click(object sender, EventArgs e)
        {
            ModoNovoPaciente();
        }

        private void numericUpDownProntuario_ValueChanged(object sender, EventArgs e)
        {
            if (modo == Modo.VIZUALIZANDO)
            {
                ModoVizualizarPaciente();
            }
        }

        private void editToolStripButton_Click(object sender, EventArgs e)
        {
            HabilitarCampos();
            numericUpDownProntuario.Enabled = false;
            modo = Modo.EDITANDO;
        }

        private void cancelarToolStripButton_Click(object sender, EventArgs e)
        {
            if (modo == Modo.EDITANDO | modo == Modo.NOVO)
            {
                ModoVizualizarPaciente();
            }
        }

        private void excluirToolStripButton_Click(object sender, EventArgs e)
        {
            if (modo == Modo.EDITANDO | modo == Modo.VIZUALIZANDO)
            {
                DialogResult result = MessageBox.Show("Excluir " + textBoxNome.Text + "?", "Excluir", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (result == DialogResult.Yes)
                {
                    facade.DeletePaciente((uint)numericUpDownProntuario.Value);
                    ModoVizualizarPaciente();
                }
            }
            else
            {
                ModoVizualizarPaciente();
            }

        }

        private void consultarToolStripButton_Click(object sender, EventArgs e)
        {
            Paciente p = facade.FindByIdPacientes((uint)numericUpDownProntuario.Value);
            if(p == null)
            {
                MessageBox.Show("Paciente não existe!", "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            Consulta consulaView = new Consulta(p.Prontuario);
            consulaView.Show();
        }
    }
}
